/*
享元模式/轻量模式（Flyweight Pattern）是一种结构型设计模式，旨在通过共享对象来最大程度地减少内存使用和提高性能。
它适用于需要创建大量相似对象的场景，通过共享相同的对象来减少内存消耗。

在享元模式中，有两种类型的对象：享元对象（Flyweight）和非(共享的)享元对象（UnsharedFlyweight）。
享元对象是可共享的，它包含了内部状态和外部状态。
内部状态是不会随着外部环境的改变而改变的，而外部状态是会随着外部环境的改变而改变的。
非享元对象是不可共享的，它包含了不可共享的外部状态。

享元模式的核心思想是将对象的状态分为内部状态和外部状态，将内部状态存储在享元对象中，而将外部状态作为参数传递给享元对象的方法。
当需要创建对象时，首先判断是否存在相同的内部状态的对象，如果存在则直接返回该对象，如果不存在则创建一个新的对象并缓存起来。
这样可以避免创建大量相似对象，从而减少内存消耗。

下面是一个使用享元模式的C语言例程，用于实现一个文本编辑器程序，其中字符是享元对象，文本是非享元对象：
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 享元对象
typedef struct
{
    char character;
} Character;

Character *createCharacter(char c)
{
    Character *character = (Character *)malloc(sizeof(Character));
    character->character = c;
    return character;
}

// 非享元对象
typedef struct
{
    Character *character;
    int position;
} Text;

Text *createText(const char *str)
{
    Text *text = (Text *)malloc(sizeof(Text));
    text->character = createCharacter(str[0]);
    text->position = 1;
    return text;
}

void appendCharacter(Text *text, char c)
{
    text->character = realloc(text->character, (text->position + 1) * sizeof(Character));
    text->character[text->position] = *createCharacter(c);
    text->position++;
}

void printText(Text *text)
{
    for (int i = 0; i < text->position; i++)
    {
        printf("%c", text->character[i].character);
    }
    printf("\n");
}

int main()
{
    Text *text = createText("Hello");
    appendCharacter(text, ',');
    appendCharacter(text, ' ');
    appendCharacter(text, 'w');
    appendCharacter(text, 'o');
    appendCharacter(text, 'r');
    appendCharacter(text, 'l');
    appendCharacter(text, 'd');
    printText(text);

    return 0;
}

/*
在上面的例程中，首先定义了享元对象Character，其中包含了一个字符作为内部状态。
然后，定义了非享元对象Text，其中包含了一个Character数组和一个位置指针作为外部状态。
在createCharacter函数中，创建了一个新的Character对象。
在createText函数中，创建了一个新的Text对象，并将第一个字符作为Character对象存储在Text对象的character数组中。
在appendCharacter函数中，将新的字符追加到Text对象的character数组中。
在printText函数中，打印出Text对象的内容。

通过使用享元模式，我们可以减少创建大量相似对象的内存消耗，提高程序的性能。
享元模式适用于需要创建大量相似对象的场景，或者需要减少内存消耗的场景。
*/